package com.nep.common.util;

import com.nep.NEPM.controller.SupervisorListViewController;
import com.nep.common.service.UserService;
import com.nep.common.service.UserServiceImpl;
import javafx.stage.Stage;
import com.nep.entity.supervisor.User;

/**
 * 应用程序上下文，用于存储全局应用状态和服务实例
 * 使用单例模式确保全局只有一个实例
 */
public class ApplicationContextUtil {
    // 使用volatile关键字保证线程安全的懒加载
    private static volatile ApplicationContextUtil instance;
    private Stage primaryStage; // JavaFX主舞台引用
    private User currentUser;   // 当前登录用户
    private long sessionStartTime; // 会话开始时间戳
    private static final long SESSION_TIMEOUT = 30 * 60 * 1000; // 30分钟超时
    private UserService userService; // 用户服务实例

    // 私有构造函数，防止外部实例化
    private ApplicationContextUtil() {
        userService = new UserServiceImpl(); // 初始化用户服务
    }

    /**
     * 获取ApplicationContext的单例实例
     * @return 全局唯一的ApplicationContext实例
     */
    public static ApplicationContextUtil getInstance() {
        // 双重检查锁定实现单例模式
        if (instance == null) {
            synchronized (ApplicationContextUtil.class) {
                if (instance == null) {
                    instance = new ApplicationContextUtil();
                }
            }
        }
        return instance;
    }

    // 获取主舞台
    public Stage getPrimaryStage() { return primaryStage; }
    // 设置主舞台
    public void setPrimaryStage(Stage primaryStage) { this.primaryStage = primaryStage; }

    // 获取当前用户
    public User getCurrentUser() { return currentUser; }

    /**
     * 设置当前用户并重置会话时间
     * @param user 当前登录用户
     */
    public void setCurrentUser(User user) {
        this.currentUser = user;
        this.sessionStartTime = System.currentTimeMillis();
    }

    // 清除当前用户信息
    public void clearUser() {
        this.currentUser = null;
    }

    /**
     * 检查会话是否有效
     * @return 如果用户已登录且会话未超时返回true，否则返回false
     */
    public boolean isSessionValid() {
        if (currentUser == null) return false;
        return (System.currentTimeMillis() - sessionStartTime) < SESSION_TIMEOUT;
    }

    // 获取用户服务实例
    public UserService getUserService() {
        return userService;
    }

    // 主管列表视图控制器引用（用于视图间通信）
    private SupervisorListViewController supervisorListViewController;

    // 设置主管列表视图控制器
    public void setSupervisorListViewController(SupervisorListViewController controller) {
        this.supervisorListViewController = controller;
    }

    // 获取主管列表视图控制器
    public SupervisorListViewController getSupervisorListViewController() {
        return supervisorListViewController;
    }
}